//Se dibuja el arbol de la expresion binaria
package mx.unam.ia.grafica;
import java.awt.*;
import javax.swing.*;
import mx.unam.ia.estructuras.*;
import java.util.ArrayList;


/**
 *
 * @author Juan Fco. Navarrete - Jorge A Hernandez
 */
public class DibujaArbol extends JFrame
{    
    private ArbolExpresionBinario arbol;
    
       
    private ArrayList<NodoPunto> lista=new ArrayList<NodoPunto>();
    public DibujaArbol(ArbolExpresionBinario arbol)
    {
        super("Arbol de Operaciones");
        this.arbol=arbol;
       
        setSize((int)Math.pow(2,arbol.getMaxProfundidad())*27,arbol.getMaxProfundidad()*38+5);
        setLocation(200,200); 
        setResizable(true);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        obtieneCoordenadas();        
    }
    @Override
    public void paint(Graphics g)
    {        
        super.paint(g);
        JWindow ventana=new JWindow();
        Scrollbar scrol=new Scrollbar();
        scrol.enableInputMethods(true);
        this.getContentPane().add(scrol);
        ventana.add(this);
        
        for (NodoPunto nodoPunto: lista)
        {
            Point p=nodoPunto.getPunto();
            Point padre=nodoPunto.getPadre();
            g.setColor(Color.GRAY);
          
            if(padre!=null)
            {
                g.drawLine(p.x*25+11,p.y*30,padre.x*25+11,padre.y*30+15);
            }            
            g.fillOval(p.x*25,p.y*30,24,24);
            g.setColor(Color.BLACK);
            g.drawString(nodoPunto.getSimbolo(),p.x*25+8,p.y*30+15);
        }
    }
    public void obtieneCoordenadas()
    {
        obtieneCoordenadas(arbol.getRaiz(),new Point((int)Math.pow(2,arbol.getMaxProfundidad())/2,1),null,arbol.getMaxProfundidad()-2);
    }
    private void obtieneCoordenadas(Nodo nodo,Point p,Point padre,int nivel)
    {
        if(nodo==null)
        {
            return;
        }
        int distanciaX=(int)Math.pow(2,nivel);
        lista.add(new NodoPunto(nodo.getDato(),p,padre));
        obtieneCoordenadas(nodo.getIzquierdo(),new Point(p.x-distanciaX,p.y+1),p,nivel-1);
        obtieneCoordenadas(nodo.getDerecho(),new Point(p.x+distanciaX,p.y+1),p,nivel-1);
    }
}
